<?php

function doQuery($M,$Q,$A="",$B="",$C="",$D="",$E="")
{
  return $GLOBALS['Systeme']->Modules[$M]->callData($Q,$A,$B,$C,$D,$E);
}

class Dossier extends genericClass
{


   /**
     * Enregistre un produti de voyage (bug étrange sinon)
     *
     * @param Object $Voyage <description>
     * @return void
     */function applyVoyage( $Voyage ) {
         $this->Voy = $Voyage;
         
     }
       
  /**
   * Vérifie que les options concordent bien avec leurs règles
   *
   * @return boolean
   */function checkOptions($Voyage=NULL,$VR=NULL,$KEMLCommandes=array(),$NbParticipants=-1) {
    $toutFonctionne = true;
    $Options        = array(); /* format : [Commande,Produit] */
    $OptionsProd    = array(); 
    $Types          = array();
    $idPrestataires = array();

    if ( empty($Voyage) && !empty($this->Voy) ) {
        $Voyage = $this->Voy;
    }
    
    if ( !empty ($Voyage) && !empty($KEMLCommandes))
      {
	$Commandes = $KEMLCommandes;
	if (is_array($Commandes)) foreach($KEMLCommandes as $Commande)
	  {
	    $getOptPR = "Boutique/ProduitReel/".$Commande->PRid;
	    $OptPR = $GLOBALS['Systeme']->Modules[$this->Module]->callData($getOptPR);

	    $getOpt = "Boutique/Produit/ProduitReel/".$OptPR[0]["Id"];
	    $Opt = $GLOBALS['Systeme']->Modules[$this->Module]->callData($getOpt);
	    $Options[] = array($Commande, genericClass::createInstance($this->Module,$Opt[0]));                          
	  }
      }              
    elseif ( empty($Voyage) ) {
      $getCommandes   =  "Boutique/Dossier/" . $this->Get("Id") . "/ProduitCommande";
      $Commandes = doQuery($this->Module,$getCommandes);   
      if ( is_array($Commandes) ) foreach( $Commandes as $Commande ) {                   
	$tmpObject = genericClass::createInstance($this->Module, $Commande);
	if ( $tmpObject->Get("Type") == "Options" ) {
	  $getOptPR = "Boutique/ProduitReel/ProduitCommande/".$tmpObject->Get("Id");
	  $OptPR = doQuery($this->Module,$getOptPR);
	  $getOpt = "Boutique/Produit/ProduitReel/".$OptPR[0]["Id"];
	  $Opt = doQuery($this->Module,$getOpt);
	  $Options[] = array($tmpObject, genericClass::createInstance($this->Module,$Opt[0]));       
	}else{
	  $getPR  = "Boutique/ProduitReel/ProduitCommande/" . $tmpObject->Get("Id");
	  $PR     = doQuery($this->Module,$getPR);
	  $getProd= "Boutique/Produit/ProduitReel/" . $PR["Id"];
	  $Prod     = doQuery($this->Module,$getProd);
	  $Voyage = $Prod;
	}        
      }                       
    }

    /* On recupere la liste des prestataires */ 
    $getPresta = "Boutique/ProduitReel/".$VR->Get("Id")."/Prestataire";
    $Pres = doQuery($this->Module,$getPresta);
    if (is_array ($Pres)) foreach ($Pres as $P) $idPrestataires[] = $P["Id"];
    /* On récupère les options de base de l'article pour comparaison */
    $Querys = array( array("Boutique/Produit/","/Configuration"),
		     array("Boutique/Configuration/","/Produit/Type=Options")
		     );
    $tmpArray = array(get_object_vars($Voyage));
    foreach( $Querys as $Query ) {
      if ( is_string($Query) ) {
	$tmpArray = doQuery($this->Module,$Query.$tmpArray[0]["Id"]);
      }
      else {
//        echo($Query[0].$tmpArray[0]["Id"] . $Query[1] );
        
	$tmpArray = doQuery($this->Module,$Query[0].$tmpArray[0]["Id"] . $Query[1]);
      }
    }
    $Query = array("Boutique/Prestataire/","/Produit");
    foreach ($idPrestataires as $p)
      {
	$R = doQuery($this->Module,$Query[0] . $p . $Query[1]);
	if (is_array($R) && sizeof($R) > 0)
	  {
	    if (!is_array($tmpArray) || sizeof($tmpArray) == 0)
	      $tmpArray = $R;
	    else
	      $tmpArray = array_merge($tmpArray,$R);
	  }
      }
    
    //	 print_r($tmpArray);
    /* On transforme le tableau d'options du produit en
       GenericClass et on verifie que les options obligatoires
       sont respectées*/
    foreach( $tmpArray as $optArray ) {
      $OptionsProd[] = genericClass::createInstance($this->Module, $optArray);
      if ($OptionsProd[count($OptionsProd) - 1]->Get("Obligatoire")) {
	/* On vérifie qu'il existe bien une commande correspondante */
	$obligatoireTrouve = false;
	foreach($Options as $OptArray)
	  {
	    if ( $OptArray[1]->Get("Id") == $OptionsProd[count($OptionsProd)-1]->Get("Id")) {
	      $obligatoireTrouve = true;
	    }
	  }
	if ( !$obligatoireTrouve ) {
	  $this->addError(array("Message" =>     
				$OptionsProd[count($OptionsProd)-1]->Get("Titre") . " : "
				. "il y a eu une erreur avec cette option obligatoire. "));
	  $toutFonctionne = false;
	}
      }
    }

    /* On verifie chaque commande */
    foreach( $Options as $OptArray ) {
      $Res = false;
      if ( empty($OptArray) ) {
	return true;
      }
      if ( !empty ($Voyage) ) 
	$Res = !$OptArray[0]->verifyCookies($NbParticipants);
      else
	$Res = !$OptArray[0]->Verify();               
      if ( $Res ) {
	$this->addError(array("Message" =>
			      $OptArray[0]->Get("Libelle") . " : "
			      . "Il y a eu une erreur avec cette option. "));
	$toutFonctionne = false;
      }
    }

    /* On regroupe les Options par Type, afin de pouvoir vérifier
       les dernières contraintes*/
    $getTypes = "Boutique/Type";
    $TypesArray = doQuery($this->Module,$getTypes);
    foreach( $TypesArray as $Type ) {
      $OptType = array();
      for( $i=0; $i<count($Options); $i++ ) {
	if ( $Options[$i][1]->Get("TypeDoption") == $Type["Nom"] ) {
	  $OptType[] = $Options[$i][0];
	}
      }
      $Types[] = array(genericClass::createInstance($this->Module, $Type),$OptType);
    }

    /* Pour les types qui demandent l'"Obligation par type", on vérifie */
    foreach( $Types as $Type ) {
      if ( $Type[0]->Get("ObligatoireType")) {
	if (!empty($Type[1]))
	  {
	    $Res = $Type[1][0]->verifyObligatoireType($Type[1],$NbParticipants);
	    if (!$Res[0]) {
	      if ( $Res[1] == "<" ) {
		$this->addError(array("Message" =>   
				      "Il y a moins de places dans les ".$Type[0]->Get("Nom") . 
				      " qu'il n'y a de participants"));                               
	      }else {
		$this->addError(array("Message" =>
				      "Il y a plus de places dans les ".$Type[0]->Get("Nom") . 
				      " qu'il n'y a de participants"));                               
	      }
	    }    
	  }    
      }
    }

    return $toutFonctionne;
  }



  /**
   * Rempli automatiquement selon les priorités les propriétés qui le souhaitent
   *
   * @param Int $NbParticipants Nombre de participants
   * @return [ProduitCommande]
   */function setAutoRemplissage( $NbParticipants,$VoyageReel ) {

    /* On associe chaque type a ses options */
    $Types      = array();
    $getTypes   = "Boutique/Type";
    $TypesArray = doQuery($this->Module,$getTypes);
    $Voyage     = NULL;
    $getVoyage  = "Boutique/Produit/ProduitReel/" . $VoyageReel->Id;
    $Voyages    = doQuery($this->Module,$getVoyage);
    $Voyage     = $Voyages[0];
    $getConfiguration = "Boutique/Produit/" . $Voyage["Id"] . "/Configuration";
    $Configurations   = doQuery($this->Module,$getConfiguration);
    $Configuration = $Configurations[0];
    $idPrestataires = array();
    $getPresta = "Boutique/ProduitReel/".$VoyageReel->Id."/Prestataire";
    $R = doQuery($this->Module,$getPresta);

    if (is_array($R)) foreach( $R  as $p) $idPrestataires[] = $p["Id"];

    foreach( $TypesArray as $Type ) {
      $getOptions = "Boutique/Configuration/" . $Configuration["Id"] .
	"/Produit/RemplissageAuto=1&TypeDoption=" . $Type["Nom"];
      $Options    = $GLOBALS["Systeme"]->Modules[$this->Module]->callData($getOptions,"","","","ASC","RemplissagePriorite");
      $Query = array("Boutique/Prestataire/","/Produit/RemplissageAuto=1&TypeDoption=" . $Type["Nom"]);
      foreach ($idPrestataires as $p)
	{
	  $R = doQuery($this->Module,$Query[0] . $p . $Query[1]);
	  if (is_array($R) && sizeof($R) > 0)
	    {
	      if (!is_array($Options) || sizeof($Options) == 0)
		$Options = $R;
	      else
		$Options = array_merge($Options,$R);
	    }
	    }
      
      if (empty($Options)) continue;

      /* On trie le tableau */
      $Rem = array();
      foreach($Options as $O) $Rem[] = $O['RemplissagePriorite'];
      array_multisort($Rem,SORT_DESC,$Options);
      /* On verifie que chacune des options soit bien en vente */
      $OptionsReelles = array();
      if ( !empty ($Options) ) {
	foreach( $Options as $Option ) {        
	  $getOptionsReelles = "Boutique/Produit/" . $Option["Id"] . "/"
	    . "ProduitReel/" . "VoyageReel=" . $VoyageReel->Id;
	  $OptionsReellesR    = doQuery($this->Module,$getOptionsReelles);
	  $getOptionsReelles = "Boutique/Produit/" . $Option["Id"] . "/"
	    . "ProduitReel/"
	    . "Permanent=1";
	  $OptionsReellesP   = doQuery($this->Module,$getOptionsReelles);
	  $OptionsReellesT    = Array();
	  if (is_array($OptionsReellesR) && sizeof($OptionsReellesR)>0)
	    $OptionsReellesT  = $OptionsReellesR;
	  else if (sizeof($OptionsReellesP)>0)
	    $OptionsReellesT  = $OptionsReellesP;
	  if ( !empty ($OptionsReellesT) )  {
	    $OptionsReelles[] = array($OptionsReellesT[0],$Option);
	  }   
	}       
	$Types[] = array($Type,$OptionsReelles);
      }
    }
    $ProduitsCommandes = array();
    foreach( $Types as $Type)
      {
	$ParticipantsRestants = $NbParticipants;
	$tmpObject = NULL;
	for($i=0;$i<count($Type[1]) && $ParticipantsRestants>0; $i++)
	  {
	    $ParticipantsA=0;
	    $tmpObject = genericClass::createInstance($this->Module,"ProduitCommande");
	    $tmpObject->Set("RefProduit","PC-".$Type[1][$i][0]["Reference"] );
	    $tmpObject->Set("Libelle",$Type[1][$i][1]["Titre"] );
	    $tmpObject->Set("Description",$Type[1][$i][1]["Description"] );
	    $tmpObject->Set("Type","Options");
	    $tmpObject->Set("PRid",$Type[1][$i][0]["Id"]);
	    $tmpObject->addParent("Boutique/ProduitReel/" . $Type[1][$i][0]["Id"]);
	    $ParticipantsA = $tmpObject->setAutoQuantity($ParticipantsRestants);
	    $tmpObject->Set("Montant",$tmpObject->getTarif() );
	    $ParticipantsRestants -= $ParticipantsA;
	    $ProduitsCommandes[] = $tmpObject;
	  }
      }
    return $ProduitsCommandes;
  }


  /**
   * Renvoie tout les produits commandes option associés
   *
   * @return [ProduitCommande]
   */function getAllPC() {
    $Query = "Boutique/Dossier/" . $this->Get("Id") . "/ProduitCommande/Type=Options";
    $Objects = array();
    $Arrays = doQuery($this->Module,$Query);
    if (is_array($Arrays)) foreach( $Arrays as $A ) {
      $O = genericClass::createInstance($this->Module,$A);
      $Q = "Boutique/ProduitReel/ProduitCommande/".$A["Id"];
      $Res = doQuery($this->Module,$Q);
      $O->Set("PRid",$Res[0]["Id"] );
      $Objects[] = $O;
    }
    return $Objects;
  }

  function Save(){
    $Query = "Boutique/Dossier/" . $this->Get("Id");	
    $Arrays = doQuery($this->Module,$Query);  
    if ($this->Valide=="1" && $Arrays[0]["Valide"]==0 && $this->LastMinute!="1")
      {
	require_once("Class/Lib/Mail.class.php");
        
	$Mail= new Mail();
	$Mail->Subject("(H2O Voyage) Validation de votre dossier");
	$Mail->From("noreply@h2ovoyage.com");
	$Mail->ReplyTo("noreply@h2ovoyage.com");
	$Query = "Systeme/User/".$this->userCreate;
	$U =  doQuery("Systeme",$Query);  
	$Mail->To($U[0]["Mail"]);
        $bloc = new Bloc();
        $mailContent = 
		    "
                     Bonjour,<br/>
                     vous avez r&eacute;cemment soumis un dossier &agrave;
  validation sur le site h2ovoyage.com.<br/>
                     Celui-ci vient d'&ecirc;tre valid&eacute; par l'&eacute;quipe du site et vous pouvez d&egrave;s maintenant passer au paiement dans votre espace client. Pour rappel, voici la r&eacute;f&eacute;rence du dossier:<br/>
                     <hr/>
                     R&Eacute;F&Eacute;RENCE : " . $this->Reference . "<br/>
                     <hr/>";
        
        $bloc->setFromVar("MailBout|Votre dossier a &eacute;t&eacute; valid&eacute;|http://www.h2ovoyage.com/Skins/H2O/Img/Logo.jpg|http://www.h2ovoyage.com",$mailContent,
                          array("BEACON"=>"BLOC"));
        
        $bloc->init(new Process());
        
        $Mail->Body($bloc->Affich());
        
	$Mail->Send();
      }
    genericClass::Save();
  }
};


?>
